package com.lanfan.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Component
public class OSSUtil {

    // 我自己的统一文件夹前缀，communication-resource
    private final String prefix = "school-files";
    // 你的 bucket，j3-communication
    private final String bucket = "gyl-spring";
    // 你的 bucket 外网访问域名，https://oss-cn-guangzhou.aliyuncs.com
    private final String endpoint = "https://oss-cn-beijing.aliyuncs.com";
    // 拼接返回url要用的，bucket + 域名 例如： j3-communication.oss-cn-guangzhou.aliyuncs.com
    private final String bucketHost = "gyl-spring.oss-cn-beijing.aliyuncs.com";
    // 这两个就没啥好说的了
    private final String accessKeyId = "LTAI5t7buWE9SaBJ4WEe9xQe";
    private final String accessKeySecret = "xZ8TCrB4akc7bgO6CjaOmAHeToz6eb";
    // 生成文件路径用的，根据日期
    private final SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");

    /**
     * 单个文件上传
     * @param file
     * @return
     */
    public String upload(MultipartFile file) {
        // 路径拼接
        String dataPath = format.format(new Date());
        // 文件名称生成
        String uuid = UUID.randomUUID().toString().replace("-", "");
        String path = prefix + "/" + dataPath + "/" + uuid + file.getOriginalFilename();
        try {
            // 上传
            ossUpload(bucket, path, file.getInputStream());
        } catch (IOException e) {
            throw new RuntimeException("文件上传失败！");
        }
        // 因为 oss 不会返回访问 url 所以我们自己可以拼接一个：
        // 协议（https://） + 域名访问地址（j3-communication.oss-cn-guangzhou.aliyuncs.com） + 自己拼接的路径（xxx/xxx/a.jpg）
        return "https://" + bucketHost + "/" + path;
    }

    /**
     * 具体上传代码
     * @param bucket backet名称
     * @param path 路径
     * @param inputStream 文件流
     * @return
     */
    private PutObjectResult ossUpload(String bucket, String path, InputStream inputStream) {
        OSS ossClient = null;
        PutObjectResult putObjectResult = null;
        try {
            // 创建OSSClient实例。
            ossClient = new OSSClientBuilder().build(endpoint
                    , accessKeyId
                    , accessKeySecret);
            // 通过文件流的形式上传文件
            putObjectResult = ossClient.putObject(bucket, path, inputStream);
        } catch (Exception e) {
            //错误处理
            throw new RuntimeException("文件上传失败！");
        } finally {
            //资源关闭
            assert ossClient != null;
            ossClient.shutdown();
        }
        return putObjectResult;
    }
}
